package projeto.lp2.grupo6.view;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import projeto.lp2.grupo6.logica.Estabelecimento;
import projeto.lp2.grupo6.logica.SistemaRecomendacaoFacade;
import projeto.lp2.grupo6.logica.Usuario;

/**
 * Aluno: 
 *      Guilherme Monteiro 
 * 	    Italo Guedes 
 * 	    Tiago Leite
 * 
 * @author guilhermemg
 * @author tiagoln
 * @author italogas
 * 
 * Classe principal do projeto, eh responsavel pela execucao do projeto.
 */ 
public class JFrameCorpoPrincipal extends javax.swing.JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private SistemaRecomendacaoFacade fachada;
    private DefaultTableModel modeloListaDeEstabelecimentos;
    private DefaultTableModel modeloOpiniaoUsuarios;
    private List<Usuario> listaNovosUsuario;
    private static String pesquisa = "";

    /** Creates new form JFrameCorpoPrincipal */
    public JFrameCorpoPrincipal() {
        javax.swing.JDialog frameCarregaArquivo = new JDialogCarregaArquivos(this);
        //javax.swing.JFrame frameHoraDaBoia = new JFrameHoraDaBoia();
        
        //frameHoraDaBoia.setVisible(true);
        frameCarregaArquivo.setVisible(true);

        initComponents();

        modeloOpiniaoUsuarios = criaModeloOpinioesUsuarios();
        modeloListaDeEstabelecimentos = criaModeloEstabelecimentos();
        listaNovosUsuario = new ArrayList<Usuario>();
        carregaModeloOpinioesUsuarios(getListaUsuarios());

        jTablePrincipal.setModel(modeloOpiniaoUsuarios);
        jTablePrincipal.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        setLarguraColunaDaTabela(jTablePrincipal);
        jTablePrincipal.requestFocus();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        buttonGroupExibirOpcoes = new javax.swing.ButtonGroup();
        painelDeRolagem = new javax.swing.JScrollPane();
        jTablePrincipal = new javax.swing.JTable();
        barraDeFerramentas = new javax.swing.JToolBar();
        jLabelExibir = new javax.swing.JLabel();
        jRadioButtonUsuarios = new javax.swing.JRadioButton();
        jRadioButtonEstabelecimentos = new javax.swing.JRadioButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        jLabelSugestao = new javax.swing.JLabel();
        jButtonGerarPopularidade = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        jButtonGerarPersonalizado = new javax.swing.JButton();
        jSeparator5 = new javax.swing.JToolBar.Separator();
        jLabel1 = new javax.swing.JLabel();
        jButtonComparar = new javax.swing.JButton();
        jTextFieldPesquisar = new javax.swing.JTextField();
        barraMenu = new javax.swing.JMenuBar();
        menuArquivo = new javax.swing.JMenu();
        itenMenuNovo = new javax.swing.JMenuItem();
        jSeparator3 = new javax.swing.JPopupMenu.Separator();
        itenMenuSalvar = new javax.swing.JMenuItem();
        jSeparator4 = new javax.swing.JPopupMenu.Separator();
        itenMenuSair = new javax.swing.JMenuItem();
        menuFerramentas = new javax.swing.JMenu();
        jMenuItemGeraEstatistica = new javax.swing.JMenuItem();
        jMenuItemEstatisticaGeral = new javax.swing.JMenuItem();
        menuAjuda = new javax.swing.JMenu();
        itenMenuSobre = new javax.swing.JMenuItem();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("HoraDaBoia");

        jTablePrincipal.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {

            }
        ));
        jTablePrincipal.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
        setLarguraColunaDaTabela(jTablePrincipal);
        jTablePrincipal.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jTablePrincipal.getTableHeader().setReorderingAllowed(false);
        jTablePrincipal.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jTablePrincipalMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                jTablePrincipalMouseReleased(evt);
            }
        });
        painelDeRolagem.setViewportView(jTablePrincipal);
        painelDeRolagem.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        barraDeFerramentas.setFloatable(false);
        barraDeFerramentas.setRollover(true);

        jLabelExibir.setText("Exibir:");
        barraDeFerramentas.add(jLabelExibir);

        buttonGroupExibirOpcoes.add(jRadioButtonUsuarios);
        jRadioButtonUsuarios.setSelected(true);
        jRadioButtonUsuarios.setText("Opinioes dos Usuarios");
        jRadioButtonUsuarios.setToolTipText("Exibe uma lista de todos os usuarios e suas opinioes.");
        jRadioButtonUsuarios.setFocusable(false);
        jRadioButtonUsuarios.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
        jRadioButtonUsuarios.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jRadioButtonUsuarios.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonUsuariosActionPerformed(evt);
            }
        });
        barraDeFerramentas.add(jRadioButtonUsuarios);

        buttonGroupExibirOpcoes.add(jRadioButtonEstabelecimentos);
        jRadioButtonEstabelecimentos.setText("Lista de Estabelecimentos");
        jRadioButtonEstabelecimentos.setToolTipText("Exibe uma lista com todos os estabelecimentos ordenada por popularidade.");
        jRadioButtonEstabelecimentos.setFocusable(false);
        jRadioButtonEstabelecimentos.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
        jRadioButtonEstabelecimentos.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jRadioButtonEstabelecimentos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jRadioButtonEstabelecimentosActionPerformed(evt);
            }
        });
        barraDeFerramentas.add(jRadioButtonEstabelecimentos);
        barraDeFerramentas.add(jSeparator2);

        jLabelSugestao.setText("Gerar sugestao:");
        barraDeFerramentas.add(jLabelSugestao);

        jButtonGerarPopularidade.setText("Por Popularidade");
        jButtonGerarPopularidade.setToolTipText("Clique para mostrar uma lista de estabelecimentos por popularidade. Ser� requisitado o n�mero de estabelecimentos a exibir.");
        jButtonGerarPopularidade.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        jButtonGerarPopularidade.setFocusable(false);
        jButtonGerarPopularidade.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonGerarPopularidade.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButtonGerarPopularidade.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonGerarPopularidadeActionPerformed(evt);
            }
        });
        barraDeFerramentas.add(jButtonGerarPopularidade);
        barraDeFerramentas.add(jSeparator1);

        jButtonGerarPersonalizado.setText("Personalizado");
        jButtonGerarPersonalizado.setToolTipText("Selecione um usuario da tabela e clique para gerar uma sugest�o personalizada.");
        jButtonGerarPersonalizado.setEnabled(false);
        jButtonGerarPersonalizado.setFocusable(false);
        jButtonGerarPersonalizado.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonGerarPersonalizado.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButtonGerarPersonalizado.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonGerarPersonalizadoActionPerformed(evt);
            }
        });
        barraDeFerramentas.add(jButtonGerarPersonalizado);
        barraDeFerramentas.add(jSeparator5);

        jLabel1.setText("Comparar algoritmos:");
        barraDeFerramentas.add(jLabel1);

        jButtonComparar.setText("Comparar");
        jButtonComparar.setFocusable(false);
        jButtonComparar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonComparar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jButtonComparar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonCompararActionPerformed(evt);
            }
        });
        barraDeFerramentas.add(jButtonComparar);

        jTextFieldPesquisar.setToolTipText("Comece a digitar para pesquisar na tabela.");
        jTextFieldPesquisar.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                jTextFieldPesquisarFocusGained(evt);
            }
            public void focusLost(java.awt.event.FocusEvent evt) {
                jTextFieldPesquisarFocusLost(evt);
            }
        });
        jTextFieldPesquisar.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jTextFieldPesquisarKeyPressed(evt);
            }
            public void keyReleased(java.awt.event.KeyEvent evt) {
                jTextFieldPesquisarKeyReleased(evt);
            }
        });

        menuArquivo.setText("Arquivo");

        itenMenuNovo.setText("Novo Usuario");
        itenMenuNovo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itenMenuNovoActionPerformed(evt);
            }
        });
        menuArquivo.add(itenMenuNovo);
        menuArquivo.add(jSeparator3);

        itenMenuSalvar.setText("Salvar Altera��es");
        itenMenuSalvar.setEnabled(false);
        itenMenuSalvar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itenMenuSalvarActionPerformed(evt);
            }
        });
        menuArquivo.add(itenMenuSalvar);
        menuArquivo.add(jSeparator4);

        itenMenuSair.setText("Sair");
        itenMenuSair.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itenMenuSairActionPerformed(evt);
            }
        });
        menuArquivo.add(itenMenuSair);

        barraMenu.add(menuArquivo);

        menuFerramentas.setText("Estat�stica");

        jMenuItemGeraEstatistica.setText("Gr�fico Estat�stico Individual");
        jMenuItemGeraEstatistica.setToolTipText("Selecione um estabelecimento da lista de estabelecimentos e clique para gerar um gr�fico.");
        jMenuItemGeraEstatistica.setEnabled(false);
        jMenuItemGeraEstatistica.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemGeraEstatisticaActionPerformed(evt);
            }
        });
        menuFerramentas.add(jMenuItemGeraEstatistica);

        jMenuItemEstatisticaGeral.setText("Estat�stica Geral");
        jMenuItemEstatisticaGeral.setToolTipText("Clique para mostrar a m�dia geral dos estabelecimentos.");
        jMenuItemEstatisticaGeral.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItemEstatisticaGeralActionPerformed(evt);
            }
        });
        menuFerramentas.add(jMenuItemEstatisticaGeral);

        barraMenu.add(menuFerramentas);

        menuAjuda.setText("Ajuda");

        itenMenuSobre.setText("Sobre");
        itenMenuSobre.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                itenMenuSobreActionPerformed(evt);
            }
        });
        menuAjuda.add(itenMenuSobre);

        barraMenu.add(menuAjuda);

        setJMenuBar(barraMenu);

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(layout.createSequentialGroup()
                        .add(20, 20, 20)
                        .add(painelDeRolagem, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 1171, Short.MAX_VALUE))
                    .add(layout.createSequentialGroup()
                        .add(barraDeFerramentas, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jTextFieldPesquisar, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 240, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(barraDeFerramentas, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 25, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(jTextFieldPesquisar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 23, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(painelDeRolagem, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 548, Short.MAX_VALUE)
                .addContainerGap())
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-1211)/2, (screenSize.height-665)/2, 1211, 665);
    }// </editor-fold>//GEN-END:initComponents

    private void itenMenuSairActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itenMenuSairActionPerformed
        System.exit(0);
    }//GEN-LAST:event_itenMenuSairActionPerformed

    private void itenMenuSobreActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itenMenuSobreActionPerformed
        new JDialogSobre().setVisible(true);
    }//GEN-LAST:event_itenMenuSobreActionPerformed

    private void jRadioButtonUsuariosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButtonUsuariosActionPerformed
        if (jTablePrincipal.getModel().equals(modeloOpiniaoUsuarios) && jTablePrincipal.getSelectedRow() != -1) {
            jButtonGerarPersonalizado.setEnabled(true);
        } else if (jTablePrincipal.getModel().equals(modeloListaDeEstabelecimentos)) {
            modeloOpiniaoUsuarios = criaModeloOpinioesUsuarios();
            carregaModeloOpinioesUsuarios(getListaUsuarios());
            jTablePrincipal.setModel(modeloOpiniaoUsuarios);
            jTablePrincipal.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
            setLarguraColunaDaTabela(jTablePrincipal);
            jButtonGerarPersonalizado.setEnabled(false);
            jMenuItemGeraEstatistica.setEnabled(false);
            if (!jTextFieldPesquisar.getText().equals("")) {
                limpaCampoPesquisa();
            }
        }
    }//GEN-LAST:event_jRadioButtonUsuariosActionPerformed

    private void jRadioButtonEstabelecimentosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jRadioButtonEstabelecimentosActionPerformed
        modeloListaDeEstabelecimentos = criaModeloEstabelecimentos();
        try {
            carregaModeloEstabelecimentos(SistemaRecomendacaoFacade.geraRecomendacao(
                    SistemaRecomendacaoFacade.getUsuarios(), getListaEstabelecimentos().size(), "lps; ; "));
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Erro: " + e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
        jTablePrincipal.setModel(modeloListaDeEstabelecimentos);
        jTablePrincipal.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
        jButtonGerarPersonalizado.setEnabled(false);
        if (jTablePrincipal.getModel().equals(modeloListaDeEstabelecimentos) && jTablePrincipal.getSelectedRow() != -1) {
            jMenuItemGeraEstatistica.setEnabled(true);
        }
        if (!jTextFieldPesquisar.getText().equals("")) {
            limpaCampoPesquisa();
        }
    }//GEN-LAST:event_jRadioButtonEstabelecimentosActionPerformed

    private void jButtonGerarPopularidadeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonGerarPopularidadeActionPerformed
        JDialogGeraRecomendacao janelaGeraRecomendacao = null;
        try {
            janelaGeraRecomendacao = new JDialogGeraRecomendacao(this, JDialogGeraRecomendacao.POPULARIDADE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
        janelaGeraRecomendacao.setVisible(true);
        limpaCampoPesquisa();
    }//GEN-LAST:event_jButtonGerarPopularidadeActionPerformed

    private void jButtonGerarPersonalizadoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonGerarPersonalizadoActionPerformed
        if (jTablePrincipal.getSelectedRow() != -1) {
            JDialogGeraRecomendacao janelaGeraRecomendacao = null;
            try {
                janelaGeraRecomendacao = new JDialogGeraRecomendacao(this, JDialogGeraRecomendacao.PERSONALIZADO);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            }
            janelaGeraRecomendacao.setVisible(true);
            limpaCampoPesquisa();
        }
    }//GEN-LAST:event_jButtonGerarPersonalizadoActionPerformed

    private void itenMenuNovoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itenMenuNovoActionPerformed
        JDialogCriacaoUsuario janelaPopularidade = null;
        jButtonGerarPersonalizado.setEnabled(false);
        try {
            janelaPopularidade = new JDialogCriacaoUsuario(this);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
        janelaPopularidade.setVisible(true);
        if (!listaNovosUsuario.isEmpty()) {
            itenMenuSalvar.setEnabled(true);
        }
        modeloOpiniaoUsuarios.fireTableDataChanged();
    }//GEN-LAST:event_itenMenuNovoActionPerformed

    private void itenMenuSalvarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_itenMenuSalvarActionPerformed
        for (Usuario usuario : listaNovosUsuario) {
            try {
                fachada.salvarUsuario(usuario);
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(this, ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            }
        }
        JOptionPane.showMessageDialog(this, "Novos usu�rios salvos com sucesso!", "Menssagem", JOptionPane.INFORMATION_MESSAGE);
        listaNovosUsuario.removeAll(listaNovosUsuario);
        itenMenuSalvar.setEnabled(false);
    }//GEN-LAST:event_itenMenuSalvarActionPerformed

    private void jButtonCompararActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonCompararActionPerformed
        JDialogGeraComparacao janelaGeraComparacao = null;
        try {
            janelaGeraComparacao = new JDialogGeraComparacao(this);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
        janelaGeraComparacao.setVisible(true);
    }//GEN-LAST:event_jButtonCompararActionPerformed

    private void jTablePrincipalMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTablePrincipalMousePressed
        if (jTablePrincipal.getModel().equals(modeloOpiniaoUsuarios)) {
            jButtonGerarPersonalizado.setEnabled(true);
        } else if (jTablePrincipal.getModel().equals(modeloListaDeEstabelecimentos)) {
            jMenuItemGeraEstatistica.setEnabled(true);
        }
    }//GEN-LAST:event_jTablePrincipalMousePressed

    private void jTablePrincipalMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTablePrincipalMouseReleased
        if (jTablePrincipal.getModel().equals(modeloOpiniaoUsuarios)) {
            jButtonGerarPersonalizado.setEnabled(true);
        } else if (jTablePrincipal.getModel().equals(modeloListaDeEstabelecimentos)) {
            jMenuItemGeraEstatistica.setEnabled(true);
        }
    }//GEN-LAST:event_jTablePrincipalMouseReleased

    private void jMenuItemGeraEstatisticaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemGeraEstatisticaActionPerformed
        if (jTablePrincipal.getSelectedRow() != -1) {
            try {
                Estabelecimento estabelecimento = transformaLinhaEmEstabelecimento();
                if (estabelecimento == null) {
                    JOptionPane.showMessageDialog(this, "Erro: Estabelecimento nulo.", "Erro", JOptionPane.ERROR_MESSAGE);
                }
                JDialogEstatistica estatistica = new JDialogEstatistica(estabelecimento);
                estatistica.setVisible(true);
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "Erro: " + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            }
        }
    }//GEN-LAST:event_jMenuItemGeraEstatisticaActionPerformed

    private void jTextFieldPesquisarKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldPesquisarKeyReleased
        pesquisaIncremental();
    }//GEN-LAST:event_jTextFieldPesquisarKeyReleased

    private void jTextFieldPesquisarKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldPesquisarKeyPressed
        pesquisaIncremental();
    }//GEN-LAST:event_jTextFieldPesquisarKeyPressed

    private void jTextFieldPesquisarFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextFieldPesquisarFocusLost
        if (jTextFieldPesquisar.getText().isEmpty()) {
            jTextFieldPesquisar.setText("Pesquisar Lista");
        }
    }//GEN-LAST:event_jTextFieldPesquisarFocusLost

    private void jTextFieldPesquisarFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_jTextFieldPesquisarFocusGained
        if (jTextFieldPesquisar.getText().equals("Pesquisar Lista")) {
            jTextFieldPesquisar.setText("");
        }
    }//GEN-LAST:event_jTextFieldPesquisarFocusGained

    private void jMenuItemEstatisticaGeralActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItemEstatisticaGeralActionPerformed
        try {
            JDialogEstatistica estatistica = new JDialogEstatistica(SistemaRecomendacaoFacade.getEstabelecimentos());
            estatistica.setVisible(true);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, "Erro: " + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_jMenuItemEstatisticaGeralActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(JFrameCorpoPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(JFrameCorpoPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(JFrameCorpoPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(JFrameCorpoPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        }
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JFrameCorpoPrincipal().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JToolBar barraDeFerramentas;
    private javax.swing.JMenuBar barraMenu;
    private javax.swing.ButtonGroup buttonGroupExibirOpcoes;
    private javax.swing.JMenuItem itenMenuNovo;
    private javax.swing.JMenuItem itenMenuSair;
    private javax.swing.JMenuItem itenMenuSalvar;
    private javax.swing.JMenuItem itenMenuSobre;
    private javax.swing.JButton jButtonComparar;
    private javax.swing.JButton jButtonGerarPersonalizado;
    private javax.swing.JButton jButtonGerarPopularidade;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabelExibir;
    private javax.swing.JLabel jLabelSugestao;
    private javax.swing.JMenuItem jMenuItemEstatisticaGeral;
    private javax.swing.JMenuItem jMenuItemGeraEstatistica;
    private javax.swing.JRadioButton jRadioButtonEstabelecimentos;
    private javax.swing.JRadioButton jRadioButtonUsuarios;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JPopupMenu.Separator jSeparator3;
    private javax.swing.JPopupMenu.Separator jSeparator4;
    private javax.swing.JToolBar.Separator jSeparator5;
    private javax.swing.JTable jTablePrincipal;
    private javax.swing.JTextField jTextFieldPesquisar;
    private javax.swing.JMenu menuAjuda;
    private javax.swing.JMenu menuArquivo;
    private javax.swing.JMenu menuFerramentas;
    private javax.swing.JScrollPane painelDeRolagem;
    // End of variables declaration//GEN-END:variables

    private DefaultTableModel criaModeloEstabelecimentos() {
        DefaultTableModel modeloTabelaEstabelecimentos = new DefaultTableModel() {

            /**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			@Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return false;
            }
        };
        modeloTabelaEstabelecimentos.addColumn("Nome Do Estabelecimento");
        modeloTabelaEstabelecimentos.addColumn("Endereco");
        modeloTabelaEstabelecimentos.addColumn("Tipo De Almo�o");
        return modeloTabelaEstabelecimentos;
    }

    private DefaultTableModel criaModeloOpinioesUsuarios() {
        DefaultTableModel modeloTabelaOpinioes = new DefaultTableModel() {

            /**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			@Override
            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return false;
            }
        };
        modeloTabelaOpinioes.addColumn("Nome");
        Iterator<Estabelecimento> iteradorEstabelecimentos = getListaEstabelecimentos().iterator();
        while (iteradorEstabelecimentos.hasNext()) {
            modeloTabelaOpinioes.addColumn(iteradorEstabelecimentos.next().getNome());
        }
        return modeloTabelaOpinioes;
    }

    private void setLarguraColunaDaTabela(JTable tabela) {
        for (int i = 0; i < tabela.getColumnCount(); i++) {
            TableColumn col = tabela.getColumnModel().getColumn(i);
            int largura = 150;
            col.setPreferredWidth(largura);
        }
    }

    private void carregaModeloEstabelecimentos(List<Estabelecimento> listaEstabelecimentos) {
        for (Estabelecimento estabelecimento : listaEstabelecimentos) {
            insereEstabelecimentoNoModelo(estabelecimento);
        }
    }

    private void carregaModeloOpinioesUsuarios(List<Usuario> listaUsuarios) {
        for (Usuario usuario : listaUsuarios) {
            insereUsuarioNoModelo(usuario);
        }
    }

    /**
     * Insere usuario no modelo.
     * 
     * @param usuario
     */
    public void insereUsuarioNoModelo(Usuario usuario) {
        if (usuario.getNome().equals("")) {
            modeloOpiniaoUsuarios.insertRow(modeloOpiniaoUsuarios.getRowCount(), new Object[]{"An�nimo"});
        } else {
            modeloOpiniaoUsuarios.insertRow(modeloOpiniaoUsuarios.getRowCount(), new Object[]{usuario.getNome()});
        }
        for (int i = 1; i < modeloOpiniaoUsuarios.getColumnCount(); i++) {
            modeloOpiniaoUsuarios.setValueAt(usuario.getListaDeOpinioes().get(i - 1).getNota(),
                    modeloOpiniaoUsuarios.getRowCount() - 1, i);
        }
    }

    /**
     * Insere estabelecimento no modelo.
     * 
     * @param estabelecimento
     */
    public void insereEstabelecimentoNoModelo(Estabelecimento estabelecimento) {
        modeloListaDeEstabelecimentos.insertRow(modeloListaDeEstabelecimentos.getRowCount(),
                new Object[]{estabelecimento.getNome(), estabelecimento.getEndereco(), estabelecimento.getTipoDeAlmoco().getNomeTipo()});
    }

    /**
     * limpa campo de pesquisa incremental.
     */
    public void limpaCampoPesquisa() {
        jTextFieldPesquisar.setText("Pesquisar Lista");
        jTablePrincipal.requestFocus();
    }

    /**
     * Metodo responsavel por fazer a pesquisa incremental no sistema.
     */
    public void pesquisaIncremental() {
        if (!jTextFieldPesquisar.getText().equals(pesquisa)) {
            if (jTablePrincipal.getModel().equals(modeloOpiniaoUsuarios)) {
                pesquisa = jTextFieldPesquisar.getText();
                modeloOpiniaoUsuarios = criaModeloOpinioesUsuarios();
                for (Usuario usuario : getListaUsuarios()) {
                    if (usuario.getNome().toLowerCase().contains(pesquisa.toLowerCase())) {
                        insereUsuarioNoModelo(usuario);
                    } else if (usuario.getNome().isEmpty()) {
                        if ("anonimo".contains(pesquisa.toLowerCase())) {
                            insereUsuarioNoModelo(usuario);
                        }
                    }
                }
                jTablePrincipal.setModel(modeloOpiniaoUsuarios);
                jTablePrincipal.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
                setLarguraColunaDaTabela(jTablePrincipal);
                jButtonGerarPersonalizado.setEnabled(false);
            } else if (jTablePrincipal.getModel().equals(modeloListaDeEstabelecimentos)) {
                pesquisa = jTextFieldPesquisar.getText();
                modeloListaDeEstabelecimentos = criaModeloEstabelecimentos();
                for (Estabelecimento estabelecimento : getListaEstabelecimentos()) {
                    if (estabelecimento.getNome().toLowerCase().contains(pesquisa.toLowerCase())) {
                        insereEstabelecimentoNoModelo(estabelecimento);
                    }
                }
                jTablePrincipal.setModel(modeloListaDeEstabelecimentos);
                jTablePrincipal.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
                jMenuItemGeraEstatistica.setEnabled(false);
            }
        }
    }

    /**
     * Carrega arquivos para o sistema rodar.
     * 
     * @param caminhoArquivoUsuarios
     * @param caminhoArquivoEstabelecimentos
     * @throws Exception
     */
    public void carregaArquivos(String caminhoArquivoUsuarios, String caminhoArquivoEstabelecimentos) throws Exception {
        fachada = new SistemaRecomendacaoFacade(caminhoArquivoUsuarios, caminhoArquivoEstabelecimentos);
    }

    /**
     * Gera uma recomendacao por popularidade.
     * 
     * @param quantidade
     * @param filtros
     * @throws Exception
     */
    public void geraRecomendacaoPopularidade(int quantidade, String filtros) throws Exception {
        modeloListaDeEstabelecimentos = criaModeloEstabelecimentos();

        carregaModeloEstabelecimentos(SistemaRecomendacaoFacade.geraRecomendacao(
                SistemaRecomendacaoFacade.getUsuarios(), quantidade, filtros));
        jTablePrincipal.setModel(modeloListaDeEstabelecimentos);
        jTablePrincipal.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
        buttonGroupExibirOpcoes.clearSelection();
        jButtonGerarPersonalizado.setEnabled(false);
    }

    /**
     * Gera uma recomendacao personalizada.
     * 
     * @param usuario
     * @param quantidade
     * @param filtros
     * @throws Exception
     */
    public void geraRecomendacaoPersonalizada(Usuario usuario, int quantidade, String filtros) throws Exception {
        modeloListaDeEstabelecimentos = criaModeloEstabelecimentos();

        carregaModeloEstabelecimentos(SistemaRecomendacaoFacade.geraRecomendacao(
                SistemaRecomendacaoFacade.getUsuarios(), usuario, quantidade, filtros));
        if (modeloListaDeEstabelecimentos.getRowCount() == 0) {
            
            carregaModeloEstabelecimentos(SistemaRecomendacaoFacade.geraRecomendacao(
                    SistemaRecomendacaoFacade.getUsuarios(), quantidade, filtros));
            JOptionPane.showMessageDialog(this, "N�o h� crit�rios suficientes para realizar uma recomenda��o personalizada.\n"
                    + "Exibindo lista por popularidade", "Alerta", JOptionPane.INFORMATION_MESSAGE);
        }
        jTablePrincipal.setModel(modeloListaDeEstabelecimentos);
        jTablePrincipal.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
        buttonGroupExibirOpcoes.clearSelection();
        jButtonGerarPersonalizado.setEnabled(false);
    }

    /**
     * Transforma linha em usuario correspondente a linha do arquivo.
     * 
     * @return usuario
     * @throws Exception
     */
    public Usuario transformaLinhaEmUsuario() throws Exception {
        Usuario usuario = null;
        if (jTablePrincipal.getModel().equals(modeloOpiniaoUsuarios)) {
            try {
                if (jTablePrincipal.getValueAt(jTablePrincipal.getSelectedRow(), 0).equals("An�nimo")) {
                    usuario = fachada.criaUsuario("");
                } else {
                    usuario = fachada.criaUsuario((String) jTablePrincipal.getValueAt(jTablePrincipal.getSelectedRow(), 0));
                }
                Iterator<Estabelecimento> iteradorListaEstabelecimentos = getListaEstabelecimentos().iterator();
                for (int i = 0; i < getListaEstabelecimentos().size(); i++) {
                    usuario.adicionaOpiniao(iteradorListaEstabelecimentos.next(),
                            (Integer) jTablePrincipal.getValueAt(jTablePrincipal.getSelectedRow(), i + 1));
                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "Erro: " + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            }

        } else {
            throw new Exception("Linha selecionada n�o � da tabela de usu�rios.");
        }
        return usuario;
    }

    /**
     * Transforma linha do arquivo em estabelecimento.
     * 
     * @return estabelecimento
     * @throws Exception
     */
    public Estabelecimento transformaLinhaEmEstabelecimento() throws Exception {
        Estabelecimento estabelecimento = null;
        if (jTablePrincipal.getModel().equals(modeloListaDeEstabelecimentos)) {
            try {
                for (Estabelecimento estabelecimentoDaLista : getListaEstabelecimentos()) {
                    if (jTablePrincipal.getValueAt(jTablePrincipal.getSelectedRow(), 0).equals(estabelecimentoDaLista.getNome())) {
                        estabelecimento = estabelecimentoDaLista;
                    }
                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "Erro: " + ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            }

        } else {
            throw new Exception("Linha selecionada n�o � da tabela de usu�rios.");
        }
        return estabelecimento;
    }

    /**
     * Retorna a lista estatica do sistema com os usuarios contidos 
     * no arquivo.
     * 
     * @return lista de usuarios
     */
    public List<Usuario> getListaUsuarios() {
        return SistemaRecomendacaoFacade.getUsuarios();
    }

    /**
     * Retorna uma instancia da classe de fachada do sistema.
     * 
     * @return fachada
     */
    public SistemaRecomendacaoFacade getFachada() {
        return fachada;
    }

    /**
     * Retora lista de estabelecimentos estatica do sistema
     * com os estabelecimentos contidos no arquivo.
     * 
     * @return lista de estabelecimentos
     */
    public List<Estabelecimento> getListaEstabelecimentos() {
        return SistemaRecomendacaoFacade.getEstabelecimentos();
    }

    /**
     * Retorna a lista de novos usuarios criados no sistema
     * 
     * @return lista de novos usuarios
     */
    public List<Usuario> getListaNovosUsuario() {
        return listaNovosUsuario;
    }
}
